home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / dev / lang / SmallEiffel.lha / SmallEiffel / lib_se / assertion.e < prev    next >
Text File  |  1998-12-22  |  6KB  |  263 lines

  1. --          This file is part of SmallEiffel The GNU Eiffel Compiler.
  2. --          Copyright (C) 1994-98 LORIA - UHP - CRIN - INRIA - FRANCE
  3. --            Dominique COLNET and Suzanne COLLIN - colnet@loria.fr 
  4. --                       http://www.loria.fr/SmallEiffel
  5. -- SmallEiffel is  free  software;  you can  redistribute it and/or modify it 
  6. -- under the terms of the GNU General Public License as published by the Free
  7. -- Software  Foundation;  either  version  2, or (at your option)  any  later 
  8. -- version. SmallEiffel is distributed in the hope that it will be useful,but
  9. -- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  10. -- or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU General Public License 
  11. -- for  more  details.  You  should  have  received a copy of the GNU General 
  12. -- Public  License  along  with  SmallEiffel;  see the file COPYING.  If not,
  13. -- write to the  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  14. -- Boston, MA 02111-1307, USA.
  15. --
  16. class ASSERTION
  17.    -- 
  18.    -- To store one assertion. 
  19.    --
  20.    
  21. inherit GLOBALS;
  22.    
  23. creation make
  24.    
  25. feature 
  26.    
  27.    tag: TAG_NAME;
  28.    
  29.    expression: EXPRESSION;
  30.    
  31.    comment: COMMENT;
  32.    
  33.    current_type: TYPE;
  34.    
  35. feature {NONE}
  36.    
  37.    make(t: like tag; exp: like expression; c: like comment) is
  38.       require
  39.      t /= void or exp /= Void or c /= Void;
  40.       do
  41.      tag := t;
  42.      expression := exp;
  43.          comment := c;
  44.       ensure     
  45.      tag = t;
  46.      expression = exp;
  47.          comment = c;
  48.       end;
  49.    
  50. feature 
  51.    
  52.    start_position: POSITION is
  53.       do
  54.      if tag /= Void then
  55.         Result := tag.start_position;
  56.      elseif expression /= Void then
  57.         Result := expression.start_position;
  58.      else
  59.         Result := comment.start_position;
  60.      end;
  61.       end;
  62.    
  63.    pretty_print is
  64.       require
  65.      fmt.indent_level >= 1;
  66.       do
  67.      if tag /= Void then
  68.         fmt.put_string(tag.to_string);
  69.         fmt.put_string(": ");
  70.      end;
  71.      if expression /= Void then
  72.         expression.pretty_print;
  73.         if fmt.semi_colon_flag then
  74.            fmt.put_string("; ");
  75.         end;
  76.      end;
  77.      if comment /= Void then
  78.         comment.pretty_print;
  79.      end;
  80.       end;
  81.    
  82.    short(h01,r01,h02,r02,h03,r03,h04,r04,h05,r05,h06,r06,h07,r07,
  83.      h08,r08,h09,r09,h10,r10,h11,r11,h12,r12,h13,r13: STRING) is
  84.       do
  85.      short_print.hook_or(h01,r01);
  86.      if tag = Void then
  87.         short_print.hook_or(h02,r02);
  88.      else 
  89.         short_print.hook_or(h03,r03);
  90.         tag.short;
  91.         short_print.hook_or(h04,r04);
  92.      end;
  93.      if expression = Void then
  94.         short_print.hook_or(h05,r05);
  95.      else
  96.         short_print.hook_or(h06,r06);
  97.         expression.short;
  98.         short_print.hook_or(h07,r07);
  99.      end;
  100.      if comment = Void then
  101.         short_print.hook_or(h08,r08);
  102.      else
  103.         short_print.hook_or(h09,r09);
  104.         comment.short(h10,r10,h11,r11);
  105.         short_print.hook_or(h12,r12);
  106.      end;
  107.      short_print.hook_or(h13,r13);
  108.       end;
  109.    
  110.    to_runnable(ct: TYPE): like Current is
  111.       require
  112.      ct.is_run_type;
  113.       local
  114.      e: like expression;
  115.       do
  116.      if current_type = Void then
  117.         current_type := ct;
  118.         Result := Current;
  119.         if expression /= Void then
  120.            e := expression.to_runnable(ct);
  121.            if e = Void then
  122.           error(start_position,fz_bad_assertion);
  123.            else
  124.           expression := e;
  125.           if not expression.result_type.is_boolean then
  126.              eh.add_type(expression.result_type,fz_is_not_boolean);
  127.              error(start_position,fz_bad_assertion);
  128.           end;
  129.            end;
  130.         end;     
  131.      else
  132.         !!Result.make(tag,expression,comment);
  133.         Result := Result.to_runnable(ct);
  134.      end;
  135.       ensure
  136.      nb_errors = 0 implies Result.is_checked;
  137.       end;
  138.    
  139.    is_checked: BOOLEAN is
  140.       do
  141.      Result := current_type /= Void;
  142.       end;
  143.    
  144.    use_current: BOOLEAN is
  145.       do
  146.      if expression /= Void then
  147.         Result := expression.use_current;
  148.      end;
  149.       end;
  150.    
  151.    afd_check is
  152.       require
  153.      is_checked
  154.       do
  155.      if expression /= Void then
  156.         expression.afd_check;
  157.      end;
  158.       end;
  159.  
  160.    compile_to_c is
  161.       require
  162.      is_checked
  163.       do
  164.      if expression /= Void then
  165.         cpp.check_assertion(expression);
  166.      end;
  167.       end;
  168.  
  169.    is_pre_computable: BOOLEAN is
  170.       do
  171.      if expression = Void then
  172.         Result := true;
  173.      else
  174.         Result := expression.is_pre_computable;
  175.      end;
  176.       end;
  177.  
  178.    is_always_true: BOOLEAN is
  179.       do
  180.      if expression = Void then
  181.         Result := true;
  182.      elseif expression.is_static then
  183.         Result := expression.static_value = 1
  184.      end;
  185.       end;
  186.  
  187.    c_declare_for_old is
  188.       require
  189.      is_checked
  190.       do
  191.      if expression /= Void then
  192.         expression.c_declare_for_old;
  193.      end;
  194.       end;
  195.  
  196.    compile_to_c_old is
  197.       require
  198.      is_checked
  199.       do
  200.      if expression /= Void then
  201.         expression.compile_to_c_old;
  202.      end;
  203.       end;
  204.  
  205.    compile_to_jvm_old is
  206.       require
  207.      is_checked
  208.       do
  209.      if expression /= Void then
  210.         expression.compile_to_jvm_old;
  211.      end;
  212.       end;
  213.    
  214. feature {ASSERTION_LIST}
  215.  
  216.    compile_to_jvm(last_chance: BOOLEAN) is
  217.      -- The boolean result of the expression is pushed.
  218.      -- When `last_chance' is true, the generated code includes an
  219.      -- error message to be printed when assertion is false.
  220.      --
  221.       require
  222.      is_checked
  223.       local
  224.      point1: INTEGER;
  225.      ca: like code_attribute;
  226.       do
  227.      ca := code_attribute;
  228.      if expression = Void then
  229.         ca.opcode_iconst_1;
  230.      else
  231.         expression.compile_to_jvm
  232.         if last_chance then
  233.            point1 := code_attribute.opcode_ifne;
  234.            ca.runtime_error(expression.start_position,Void,fz_50);
  235.            ca.resolve_u2_branch(point1);
  236.            ca.opcode_iconst_1;
  237.         end;
  238.      end;
  239.       end;
  240.  
  241. feature {ASSERTION_LIST}
  242.  
  243.    collect_c_tmp is
  244.       do
  245.      if expression /= Void then
  246.         expression.collect_c_tmp;
  247.      end;
  248.       end;
  249.  
  250. feature {NONE}
  251.  
  252.    tmp_string: STRING is
  253.       once
  254.      !!Result.make(128);
  255.       end;
  256.  
  257. invariant
  258.    
  259.    tag /= Void or expression /= Void or comment /= Void;
  260.    
  261. end -- ASSERTION
  262.  
  263.